##########
# Crossing Borders: Reading & Cleaning electoral data
##########

library(here)
library(data.table)
library(readxl)
library(zoo)

# Version history:
# - 2020-07-01, Original Version
# - 2021-03-05
#   - Updated to save vote shares for other mainstream parties: SP, FDP, CVP/EVP, Greens/Green Liberals. 

# We need one data.tables from muniPopCleaning.R to make this work:
# * cw: the c-ross w-walk that updates historic municipality vintages to contemporary vintages. Covers 1960-2019.

# data downloaded from here: https://www.pxweb.bfs.admin.ch/pxweb/de/px-x-1702020000_105/px-x-1702020000_105/px-x-1702020000_105.px
# "<B>Metainformation:</B>
# Letzte Änderungen: Parteienauswahl, Wahlen 1971
# Erhebungsstichtag: Wahldatum
# Stand der Datenbank: 24.02.2020
# Raumbezug: Gemeinden per 01.01.2019, inkl. Spezialgemeinden der politischen Statistik
# Erhebung: Statistik der Wahlen und Abstimmungen"

# "Gemeindestand:
# Der Gemeindestand in der Schweiz verändert sich über die Jahre (z.B. durch Gemeindefusionen). Damit Wahlergebnisse auf der Gemeindeebene über die Zeit miteinander vergleichbar sind, muss der Gemeindestand auf einen bestimmten Zeitpunkt harmonisiert werden.
# Bei der Harmonisierung der Resultate auf den Gemeindestand von 2019 ergeben sich gewisse Probleme für jene einzelnen Gemeinden/Bezirke, die vom Kanton Bern zum Kanton Jura bzw. zum Kanton Basel-Landschaft gewechselt haben. Den Wählenden stand während der Zugehörigkeit zum Kanton Bern nämlich ein anderes - breiteres - Parteienangebot zur Verfügung und sie konnten aufgrund der Grösse des Kantons Bern deutlich mehr Stimmen an die Parteien verteilen (Bern 25 bis 31 Sitze, Basel-Landschaft 7 Sitze, Jura 2 Sitze). Die Ergebnisse in diesen Gemeinden/Bezirken sind deshalb nicht mit den übrigen Gemeinden/Bezirken im Kanton Jura bzw. Basel-Landschaft vergleichbar.
# Die Gemeinde Vellerat hat im Jahr 1996 (1.7.) vom Kanton Bern zum Kanton Jura gewechselt und per 1.1.2019 mit der Gemeinde Courrendlin (Bezirk Delémont) fusioniert. Courrendlin und der Bezirk Delémont wurden für die Wahlen 1971-1995 wegen der eingeschränkten Vergleichbarkeit aus dem Datenwürfel entfernt. Auf Anfrage sind die effektiven Stimmenzahlen (ohne Berücksichtigung des harmonisierten Gemeindestandes) beim BFS erhältlich.
# Der Bezirk Laufen (mit 13 Gemeinden) wechselte am 1.1.1994 von Bern zu Basel Landschaft. Da der Bezirk als Ganzes den Kanton gewechselt hat, ist - anders als bei Vellerat - eine Verzerrung innerhalb des Bezirks nicht gegeben und Vergleiche sind möglich. Hingegen ist bei Aggregationen und Vergleichen mit anderen Bezirken/Gemeinden im Kanton Basel-Landschaft diesem Umstand für die Wahlen 1971-1991 Rechnung zu tragen. So war beispielsweise die Partei der Arbeit (PdA) vor dem Wechsel des Laufentals gar nicht im Kanton Basel-Landschaft präsent. Wegen der Harmonisierung erscheint die PdA jedoch in den Ergebnissen der Wahljahre 1971 bis 1991."


# 1987 election (added later--requested in review) ------------------------

elec_1987 <- read_xlsx(here("data", "cleaning", "Elections", "px-x-1702020000_105_1987.xlsx"), skip = 2); setDT(elec_1987)
setnames(elec_1987, new = c("bfs19", "name", "year1", "year2", "partyNum", "partyName", "voteRaw", "votePrct"))

last_keep <- elec_1987[ , grep("Metainformation", bfs19) - 2] 
elec_1987 <- elec_1987[1:(last_keep)]; rm(last_keep)
#elec_1987$partyName %>% unique
for(j in c("bfs19", "name", "year1", "year2")) set(elec_1987, j = j, value = na.locf(elec_1987[[j]]))

### Drop the data we don't need

# Drop Bezirks, Districts, and other non-municipality places with ">>"
elec_1987 <- elec_1987[!grepl(">>", name)]

# drop the others/foreign voters categories
set(elec_1987, j = "bfs19", value = as.integer(elec_1987$bfs19))
elec_1987 <- elec_1987[bfs19 < 9000]

# Drop the duplicated year variable and rename the remaining one
set(elec_1987, j = "year2", value = NULL); setnames(elec_1987, old = "year1", new = "year")

### Clean up the variables and create the new measures we need
elec_1987[ , voteRaw := fifelse(voteRaw == "...", "0", voteRaw)]
elec_1987[ , votePrct := fifelse(votePrct == "...", "0", votePrct)]

for(j in c("voteRaw", "votePrct")) set(elec_1987, j = j, value = as.numeric(elec_1987[[j]]))

# Update March 2021: This gets votes for the far right parties, plus the other mainstream parties (SP, FDP, CVP/EVP, GPS/GLP)
fr_parties <- c("SVP", "Rep.", "Lega", "SD", "MCR", "FPS")
elec_1987FR <- elec_1987[ , .(
  frVotes = sum(voteRaw[partyName %in% fr_parties]),
  frPrct = sum(votePrct[partyName %in% fr_parties]),
  spVotes = sum(voteRaw[partyName == "SP"]),
  spPrct = sum(votePrct[partyName == "SP"]),
  fdpVotes = sum(voteRaw[partyName == "FDP"]),
  fdpPrct = sum(votePrct[partyName == "FDP"]),
  cdVotes = sum(voteRaw[partyName %in% c("CVP", "EVP")]),
  cdPrct = sum(votePrct[partyName %in% c("CVP", "EVP")]),
  grVotes = sum(voteRaw[partyName %in% c("GPS", "GLP")]),
  grPrct = sum(votePrct[partyName %in% c("GPS", "GLP")]),
  centerVotes = sum(voteRaw[partyName %in% c("EVP", "CVP", "GLP")]),
  centerPrct = sum(votePrct[partyName %in% c("EVP", "CVP", "GLP")]),
  leftVotes = sum(voteRaw[partyName %in% c("GPS", "SP")]),
  leftPrct = sum(votePrct[partyName %in% c("GPS", "SP")]),
  otherVotes = sum(voteRaw[!partyName %in% c(fr_parties, "SP", "FDP", "CVP", "EVP", "GPS", "GLP")]),
  otherPrct = sum(votePrct[!partyName %in% c(fr_parties, "SP", "FDP", "CVP", "EVP", "GPS", "GLP")])
),
keyby = .(bfs19, year)]

# fix classes for later merging
set(elec_1987FR, j = "year", value = as.integer(elec_1987FR$year))
elec_1987 <- elec_1987[year == 1987]
elec_1987FR <- elec_1987FR[year == 1987]







# Elections after 1991 ----------------------------------------------------
### Preliminaries: Read data, change column names, drop metainformation, fill in the empty cells
elec_late <- read_xlsx(here("data", "cleaning", "Elections", "px-x-1702020000_105.xlsx"), skip = 2); setDT(elec_late)
setnames(elec_late, new = c("bfs19", "name", "year1", "year2", "partyNum", "partyName", "voteRaw", "votePrct"))


last_keep <- elec_late[ , grep("Metainformation", bfs19) - 2] 
elec_late <- elec_late[1:(last_keep)]; rm(last_keep)
#elec$partyName %>% unique
for(j in c("bfs19", "name", "year1", "year2")) set(elec_late, j = j, value = na.locf(elec_late[[j]]))

### Drop the data we don't need

# Drop Bezirks, Districts, and other non-municipality places with ">>"
elec_late <- elec_late[!grepl(">>", name)]

# drop the others/foreign voters categories
set(elec_late, j = "bfs19", value = as.integer(elec_late$bfs19))
elec_late <- elec_late[bfs19 < 9000]

# Drop the duplicated year variable and rename the remaining one
set(elec_late, j = "year2", value = NULL); setnames(elec_late, old = "year1", new = "year")

### Clean up the variables and create the new measures we need
elec_late[ , voteRaw := fifelse(voteRaw == "...", "0", voteRaw)]
elec_late[ , votePrct := fifelse(votePrct == "...", "0", votePrct)]

for(j in c("voteRaw", "votePrct")) set(elec_late, j = j, value = as.numeric(elec_late[[j]]))

# Update March 2021: This gets votes for the far right parties, plus the other mainstream parties (SP, FDP, CVP/EVP, GPS/GLP)
fr_parties <- c("SVP", "Rep.", "Lega", "SD", "MCR", "FPS")
elec_lateFR <- elec_late[ , .(
  frVotes = sum(voteRaw[partyName %in% fr_parties]),
  frPrct = sum(votePrct[partyName %in% fr_parties]),
  spVotes = sum(voteRaw[partyName == "SP"]),
  spPrct = sum(votePrct[partyName == "SP"]),
  fdpVotes = sum(voteRaw[partyName == "FDP"]),
  fdpPrct = sum(votePrct[partyName == "FDP"]),
  cdVotes = sum(voteRaw[partyName %in% c("CVP", "EVP")]),
  cdPrct = sum(votePrct[partyName %in% c("CVP", "EVP")]),
  grVotes = sum(voteRaw[partyName %in% c("GPS", "GLP")]),
  grPrct = sum(votePrct[partyName %in% c("GPS", "GLP")]),
  centerVotes = sum(voteRaw[partyName %in% c("EVP", "CVP", "GLP")]),
  centerPrct = sum(votePrct[partyName %in% c("EVP", "CVP", "GLP")]),
  leftVotes = sum(voteRaw[partyName %in% c("GPS", "SP")]),
  leftPrct = sum(votePrct[partyName %in% c("GPS", "SP")]),
  otherVotes = sum(voteRaw[!partyName %in% c(fr_parties, "SP", "FDP", "CVP", "EVP", "GPS", "GLP")]),
  otherPrct = sum(votePrct[!partyName %in% c(fr_parties, "SP", "FDP", "CVP", "EVP", "GPS", "GLP")])
  ),
  keyby = .(bfs19, year)]

# fix classes for later merging
set(elec_lateFR, j = "year", value = as.integer(elec_lateFR$year))




#Full Election Data
elec <- rbindlist(list(elec_1987, elec_late))
elecFR <- rbindlist(list(elec_1987FR, elec_lateFR))

rm(elec_1987)
rm(elec_1987FR)
rm(elec_late)
rm(elec_lateFR)
rm(fr_parties)



message(
  "You've produced the following datasets:
  * elec: data with a row for each year-bfs19-party combination, measures party votes and prct
  * elecFR: data with a row for each year-bfs19 combination, measures raw votes and vote percentages for political parties"
)

